Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Exceptions
8 Die Funktionsbibliothek
9 Threads und nebenläufige Programmierung
10 Raum und Zeit
11 Datenstrukturen und Algorithmen
12 Dateien und Datenströme
13 Die eXtensible Markup Language (XML)
14 Grafische Oberflächen mit Swing
15 Grafikprogrammierung
16 Das Netz
17 JavaServer Pages und Servlets
18 Verteilte Programmierung mit RMI und Web–Services
19 Applets, Midlets und Sound
20 Datenbankmanagement mit JDBC
21 Reflection und Annotationen
22 Komponenten durch Bohnen
23 Logging und Monitoring
24 Sicherheitskonzepte
25 Java Native Interface (JNI)
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Index

Download:
- ZIP, ca. 12,5 MB
Buch bestellen

Website zum Buch
Weblog des Autors
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel

Java ist auch eine Insel
6., akt. und erw. Aufl., mit DVD
1.454 S., 49,90 Euro
Galileo Computing
ISBN 3-89842-838-9
gp 24 Sicherheitskonzepte
  gp 24.1 Zentrale Elemente der Java-Sicherheit
    gp 24.1.1 Java Cryptography Architecture und Extension
  gp 24.2 Der Sandkasten (Sandbox)
  gp 24.3 Sicherheitsmanager (Security Manager)
    gp 24.3.1 Der Sicherheitsmanager bei Applets
    gp 24.3.2 Sicherheitsmanager aktivieren
    gp 24.3.3 Wie nutzen die Java-Bibliotheken den Sicherheitsmanager?
    gp 24.3.4 Rechte durch Policy-Dateien vergeben
    gp 24.3.5 Erstellen von Rechte-Dateien mit dem grafischen Policy-Tool
    gp 24.3.6 Kritik an den Policies
  gp 24.4 Signierung
    gp 24.4.1 Warum signieren?
    gp 24.4.2 Digitale Ausweise und die Zertifizierungsstelle
    gp 24.4.3 Mit keytool Schlüssel erzeugen
    gp 24.4.4 Signieren mit jarsigner
  gp 24.5 Digitale Unterschriften
    gp 24.5.1 Die MDx-Reihe
    gp 24.5.2 Secure Hash Algorithm (SHA)
    gp 24.5.3 Mit der Security-API einen Fingerabdruck berechnen
    gp 24.5.4 Die Klasse MessageDigest
    gp 24.5.5 Unix-Crypt
  gp 24.6 Verschlüsseln von Daten(-strömen)
    gp 24.6.1 Den Schlüssel bitte
    gp 24.6.2 Verschlüsseln mit Cipher
    gp 24.6.3 Verschlüsseln von Datenströmen
  gp 24.7 Zum Weiterlesen


Galileo Computing

24.6 Verschlüsseln von Daten(-strömen)  downtop

Die Security-API von Java ist sehr unabhängig von kryptografischen Algorithmen und bietet zunächst Schnittstellen für Schlüssel und Implementierungen. Die konkreten Algorithmen wie RSA oder DES realisieren Provider – Sun ist einer von ihnen. Neue Provider lassen sich jederzeit einbringen, insbesondere, wenn uns die Amerikaner nicht erlauben, eine starke Verschlüsselung zu verwenden.

Die Kryptografie unterscheidet zwischen asymmetrischer und symmetrischer Verschlüsselung. Ist die Kommunikation asymmetrisch, sind zwei Schlüssel nötig: ein öffentlicher und ein privater. Bei der symmetrischen Verschlüsselung ist nur ein Schlüssel nötig, der bei der Ver- und Entschlüsselung gleich ist. Bekanntester Vertreter der symmetrischen Verschlüsselung ist DES (Data Encryption Standard), der allerdings wegen seiner geringen Schlüssellänge nicht mehr aktuell ist. DES wurde 1981 in den USA als ANSI-Standard normiert. Bei den asymmetrischen Verfahren ist die RSA-Verschlüsselung die bekannteste. Ihre Sicherheit basiert auf dem mathematischen Problem, für eine große Ganzzahl eine Primfaktorzerlegung zu finden. Asymmetrische Verschlüsselung ist im Vergleich zu symmetrischen Verschlüsselungen langsam.


Galileo Computing

24.6.1 Den Schlüssel bitte  downtop

Jeder Schlüssel, sei er privat oder öffentlich, implementiert die Basisschnittstelle java.security.Key. Von dieser Schnittstelle gibt es Unterschnittstellen, etwa PublicKey, PrivateKey für die asymmetrischen Schlüssel oder SecretKey für den symmetrischen Schlüssel. Von diesen Schnittstellen gibt es weitere Unterschnittstellen.

Schlüssel aus der Fabrik

Um Schlüssel zu erzeugen, gibt es zwei Fabriken: KeyGenerator erzeugt symmetrische Schlüssel und KeyPairGenerator asymmetrische. Der Fabrikfunktion getInstance() ist dabei eine Kennung zu übergeben, die für den Algorithmus steht.

Listing 24.7    com/javatutor/security/crypto/KeyGeneratorDemo.java, main()

KeyGenerator kg = KeyGenerator.getInstance( "DES" ); 
KeyPairGenerator kpg = KeyPairGenerator.getInstance( "RSA" );

Der nächste Schritt sieht eine Initialisierung des Schlüssels mit zufälligen Werten vor. Ohne Initialisierung kann jeder Provider unterschiedlich verfahren.

kg.init( 56 );                // nicht größer als 56! 
kpg.initialize( 1024 );

Schlau, wie Sun ist, haben sie eine Funktion init() und die andere initialize() genannt. Toll. Beiden Funktionen lässt sich noch ein Zufallszahlengenerator mitgeben, doch intern ist das SecureRandom schon sehr gut. Kryptografische Angaben kann ein AlgorithmParameterSpec-Objekt einführen.

Der letzte Schritt besteht im Erfragen der Schlüssel.

SecretKey secKey  = kg.generateKey(); 
KeyPair   keyPair = kpg.genKeyPair();

Bei einer Ausgabe des symmetrischen Schlüssels über System.out.println() kommt nicht viel Sinnvolles heraus, doch bei den privaten und öffentlichen Schlüsseln, die keyPair mit getPublic() und getPrivate() offen legt, implementieren PublicKey und PrivateKey eine ansehnliche toString()-Funktion.

System.out.println( keyPair.getPublic() );

Liefert

SunJSSE RSA public key: 
  public exponent: 
    010001 
  modulus: 
    a8186ac3 03b9417e c0247c70 d225ae75 04d2fa3b 9b21e009 ca32a1f3 3cc7404f 
    aeb6df52 0aa4d9ab ae35a5d5 d7b30f38 ce670895 3234fab2 c67f1211 b9dab8d2 
    edda3a7b 710fbf86 0274a2a6 842c4d73 76fc2166 80ef1e82 36a949f9 8180c5c7 
    004cffdd c103b42b 9abf216d 5f797440 20b8ec52 afe44407 a871e1f7 0e27fec9

System.out.println(keyPair.getPrivate()) liefert eine noch längere Ausgabe mit Exponent, Modulo usw.

SecretKeySpec

Schlüssel für die symmetrische Verschlüsselung sind nichts anderes als Binärfelder. Die Klasse javax.crypto.spec.SecretKeySpec dient zum Erzeugen eines symmetrischen Schlüssels und erwartet im Konstruktor das Bytefeld und den Algorithmus.

Key k = new SecretKeySpec( "01234567".getBytes(), "DES" );

Für andere Typen existieren wiederum andere Klassen. Zum Beispiel erzeugt DSAPrivateKeySpec einen privaten Schlüssel aus dem privaten Schlüssel, zwei Primzahlen und einer Basis, die als BigInteger-Objekte angegeben sind.


Galileo Computing

24.6.2 Verschlüsseln mit Cipher  downtop

Die Klasse javax.crypto.Cipher bildet das Zentrum der JCE. Nachdem init() das Objekt mit einem Modus und Schlüssel initialisiert hat, lassen sich mit update(byte[]) Daten durchschleusen. doFinal() rundet das Ganze dann ab. Die Rückgabe ist immer ein verschlüsselter Block von byte.

Cipher cipher = Cipher.getInstance( "DES" ); 
cipher.init( Cipher.ENCRYPT_MODE, key ); 
byte[] verschlüsselt = cipher.doFinal( unverschlüsselt );

Beim Entschlüsseln wird der Cipher einfach in den Modus Cipher.DECRYPT_MODE gesetzt.


Galileo Computing

24.6.3 Verschlüsseln von Datenströmen  toptop

Zum Verschlüsseln von Datenströmen bietet das Java-SDK die praktischen Klassen javax.crypto.CipherInputStream und CipherOutputStream an. Sie erwarten ein Cipher-Objekt, das eine DES-Verschlüsselung durchführt.

Listing 24.8    com/javatutor/security/crypto/ReadWriteDES.java

package com.javatutor.security.crypto; 
 
import java.io.*; 
import java.security.Key; 
import javax.crypto.*; 
import javax.crypto.spec.SecretKeySpec; 
import sun.misc.*; 
 
public class ReadWriteDES 
{ 
  static void encode( byte[] bytes, OutputStream out, String pass ) throws Exception 
  { 
    Cipher c = Cipher.getInstance( "DES" ); 
    Key k = new SecretKeySpec( pass.getBytes(), "DES" ); 
    c.init( Cipher.ENCRYPT_MODE, k ); 
 
    OutputStream cos = new CipherOutputStream( out, c ); 
    cos.write( bytes ); 
    cos.close(); 
  } 
 
  static byte[] decode( InputStream is, String pass ) throws Exception 
  { 
    Cipher c = Cipher.getInstance( "DES" ); 
    Key k = new SecretKeySpec( pass.getBytes(), "DES" ); 
    c.init( Cipher.DECRYPT_MODE, k ); 
 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    CipherInputStream cis = new CipherInputStream( is, c ); 
 
    for ( int b; (b = cis.read()) != -1; ) 
      bos.write( b ); 
 
    cis.close(); 
    return bos.toByteArray(); 
  } 
 
  public static void main( String[] args ) throws Exception 
  { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    encode( "Das wird anders werden".getBytes(), out, "01234567" ); 
 
    String s = new BASE64Encoder().encode( out.toByteArray() ); 
    System.out.println( s );  // qJYN+8Hd5dXsgMl1akQnw4iCbRN3EUbK 
 
    byte[] decode = new BASE64Decoder().decodeBuffer( s ); 
    InputStream is = new ByteArrayInputStream( decode ); 
    System.out.println( new String( decode( is, "01234567" ) ) ); 
  } 
}


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.





 <<   zurück



Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de